package com.springboot.frame.service;

import com.springboot.frame.Condition;
import com.springboot.frame.enums.BatchType;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 公共service接口
 *
 * @author liheng
 */
public interface BaseService<T extends Serializable, PK extends Serializable> {

  /**
   * 通过主键查询单结果
   *
   * @param id 主键
   * @return 单个结果
   */
  T selectById(PK id);

  /**
   * 通过条件对象查询单结果
   *
   * @param condition 条件对象
   * @return 单个结果
   */
  T selectOnly(Condition<T> condition);

  /**
   * 通过主键集合查询多个结果
   *
   * @param ids 主键集合
   * @return 多个结果
   */
  List<T> selectBatchIds(Collection<PK> ids);

  /**
   * 通过条件对象查询数据量
   *
   * @param condition 条件对象
   * @return 数据量
   */
  PK selectCount(Condition<T> condition);

  /**
   * 通过条件对象查询多个结果
   *
   * @param condition 条件对象
   * @return 多个结果
   */
  List<T> selectList(Condition<T> condition);


  /**
   * 通过主键删除单对象
   *
   * @param id 主键
   * @return 是否删除成功
   */
  boolean deleteById(PK id);

  /**
   * 通过条件对象删除
   *
   * @param condition 条件对象
   * @return 是否删除成功
   */
  boolean delete(Condition<T> condition);

  /**
   * 通过主键集合删除
   *
   * @param ids 主键集合
   * @return 是否删除成功
   */
  boolean deleteBatchIds(Collection<PK> ids);

  /**
   * 清空表
   * @return
   */
  boolean truncateTable();
  /**
   * 选择性插入一个对象
   *
   * @param t 待插入对象
   * @return 是否插入成功
   */
  boolean insert(T t);

  /**
   * 全可插入字段插入一个对象
   *
   * @param t 待插入对象
   * @return 是否插入成功
   */
  boolean insertAllColumns(T t);

  /**
   * 通过主键更新对象
   *
   * @param t 需要更新的对象,需带主键
   * @return 是否更新成功
   */
  boolean updateById(T t);

  /**
   * 全可更新字段通过主键更新对象
   *
   * @param t 需要更新的对象,需带主键
   * @return 是否更新成功
   */
  boolean updateAllColumnsById(T t);

  /**
   * 通过条件对象选择性更新对象
   *
   * @param condition 条件对象
   * @return 是否更新成功
   */
  boolean update(Condition<T> condition);

  /**
   * 全可更新字段通过条件更新对象
   *
   * @param condition 条件对象
   * @return 是否更新成功
   */
  boolean updateAllColumns(Condition<T> condition);

  /**
   * 根据主键Id,选择性保存或者更新对象
   *
   * @param t 需要保存或更新的对象
   * @return 是否保存或更新成功
   */
  boolean saveOrUpdate(T t);

  /**
   * 全可更新或插入字段根据主键Id,保存或者更新对象
   *
   * @param t 需要保存或更新的对象
   * @return 是否保存或更新成功
   */
  boolean saveOrUpdateAllColumns(T t);

  /**
   * 批量选择性插入一组数据
   *
   * @param data 需要插入的对象集合
   * @return 是否插入成功
   */
  boolean batchInsert(Collection<T> data);

  /**
   * 批量全可插入字段插入一组数据
   *
   * @param data 需要插入的对象集合
   * @return 是否插入成功
   */
  boolean batchInsertAllColumns(Collection<T> data);

  /**
   * 批量选择性插入一组数据
   *
   * @param data 需要更新的对象集合
   * @return 是否更新成功
   */
  boolean batchUpdateById(Collection<T> data);

  /**
   * 批量全可更新字段插入一组数据
   *
   * @param data 需要更新的对象集合
   * @return 是否更新成功
   */
  boolean batchUpdateAllColumnsById(Collection<T> data);

  /**
   * 批量选择性保存或更新一组数据
   *
   * @param data 需要保存或更新的对象集合
   * @return 是否保存或更新成功
   */
  boolean batchSaveOrUpdate(Collection<T> data);

  /**
   * 批量全可更新或插入字段保存或更新一组数据
   *
   * @param data 需要保存或更新的对象集合
   * @return 是否保存或更新成功
   */
  boolean batchSaveOrUpdateAllColumns(Collection<T> data);

  /**
   * 执行批量操作
   *
   * @param data 数据集合
   * @param method 批量操作类型
   * @return 是否执行成功
   */
  boolean executeBatch(Collection<T> data, BatchType method);

  /**
   * 执行批量操作
   *
   * @param data 数据集合
   * @param method 批量操作类型
   * @param batchSize 刷新大小
   * @return 是否执行成功
   */
  boolean executeBatch(Collection<T> data, BatchType method, int batchSize);

}
